Code Contracts with Interfaces: "Method Invocation skipped. Compiler will generate method invocation

Posted by Jörg Battermann on Stack Overflow See other posts from Stack Overflow or by Jörg Battermann
Published on 2010-03-12T22:22:51Z Indexed on 2010/03/12 22:27 UTC
Read the original article Hit count: 1508

Filed under:
|
|

Good evening,

I just started playing with Microsoft.Contracts (latest version) and plugging it on top of a sample interface and right now it looks like this:

namespace iRMA2.Core.Interfaces
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.Composition;
    using System.Diagnostics.Contracts;

    /// <summary>
    /// Base Interface declarations for iRMA2 Extensions
    /// </summary>
    [InheritedExport]
    [ContractClass(typeof(IiRMA2ExtensionContract))]
    public interface IiRMA2Extension
    {
        /// <summary>
        /// Gets the name.
        /// </summary>
        /// <value>The name of the Extension.</value>
        string Name { get; }

        /// <summary>
        /// Gets the description.
        /// </summary>
        /// <value>The description.</value>
        string Description { get; }

        /// <summary>
        /// Gets the author of the extension. Please provide complete information to get in touch with author(s) and the corresponding department
        /// </summary>
        /// <value>The author of the extensions.</value>
        string Author { get; }

        /// <summary>
        /// Gets the major version.
        /// </summary>
        /// <value>The major version of the extension.</value>
        int MajorVersion { get; }

        /// <summary>
        /// Gets the minor version.
        /// </summary>
        /// <value>The minor version.</value>
        int MinorVersion { get; }

        /// <summary>
        /// Gets the build number.
        /// </summary>
        /// <value>The build number.</value>
        int BuildNumber { get; }

        /// <summary>
        /// Gets the revision.
        /// </summary>
        /// <value>The revision.</value>
        int Revision { get; }

        /// <summary>
        /// Gets the depends on.
        /// </summary>
        /// <value>The dependencies to other <c>IiRMA2Extension</c> this one has.</value>
        IList<IiRMA2Extension> DependsOn { get; }
    }

    /// <summary>
    /// Contract class for <c>IiRMA2Extension</c>
    /// </summary>
    [ContractClassFor(typeof(IiRMA2Extension))]
    internal sealed class IiRMA2ExtensionContract : IiRMA2Extension
    {
        #region Implementation of IiRMA2Extension

        /// <summary>
        /// Gets or sets the name.
        /// </summary>
        /// <value>The name of the Extension.</value>
        public string Name
        {
            get
            {
                Contract.Ensures(!String.IsNullOrEmpty(Contract.Result<string>()));
                return default(string);
            }

            set
            {
                Contract.Requires(value != null);
            }
        }

        /// <summary>
        /// Gets the description.
        /// </summary>
        /// <value>The description.</value>
        public string Description
        {
            get { throw new NotImplementedException(); }
        }

        /// <summary>
        /// Gets the author of the extension. Please provide complete information to get in touch with author(s) and the corresponding department
        /// </summary>
        /// <value>The author of the extensions.</value>
        public string Author
        {
            get { throw new NotImplementedException(); }
        }

        /// <summary>
        /// Gets the major version.
        /// </summary>
        /// <value>The major version of the extension.</value>
        public int MajorVersion
        {
            get { throw new NotImplementedException(); }
        }

        /// <summary>
        /// Gets the minor version.
        /// </summary>
        /// <value>The minor version.</value>
        public int MinorVersion
        {
            get { throw new NotImplementedException(); }
        }

        /// <summary>
        /// Gets the build number.
        /// </summary>
        /// <value>The build number.</value>
        public int BuildNumber
        {
            get { throw new NotImplementedException(); }
        }

        /// <summary>
        /// Gets the revision.
        /// </summary>
        /// <value>The revision.</value>
        public int Revision
        {
            get { throw new NotImplementedException(); }
        }

        /// <summary>
        /// Gets the Extensions this one depends on.
        /// </summary>
        /// <value>The dependencies to other <c>IiRMA2Extension</c> this one has.</value>
        public IList<IiRMA2Extension> DependsOn
        {
            get
            {
                Contract.Ensures(Contract.Result<IList<IiRMA2Extension>>() != null);
                return default(IList<IiRMA2Extension>);
            }
        }

        #endregion
    }
}

Now why are the two Contract.Ensures(...) 'blured' out visually with the tooltip saying "Method Invocation skipped. Compiler will generate method invocation because the method is conditional or it is partial method without implementation" and in fact the CodeContracts output does not count/show them... What am I missing & doing wrong here?

-J

© Stack Overflow or respective owner

Related posts about .NET

Related posts about code